<?php

namespace app\admin\model\sum\goods;

use app\admin\model\sum\Common;
use traits\model\SoftDelete;
use addons\sum\library\Tree;
use app\admin\model\sum\Category;
//use app\admin\model\sum\activity\Activity as ActivityModel;
//use app\admin\model\sum\activity\SkuPrice as ActivitySkuPriceModel;
//use app\admin\model\sum\app\ScoreSkuPrice;
//use app\admin\model\sum\user\GoodsLog;
//use app\admin\model\sum\order\Order;
//use app\admin\model\sum\order\OrderItem;
//use addons\sum\facade\Activity as ActivityFacade;


class Goods extends Common
{

    use SoftDelete;

    protected $deleteTime = 'deletetime';

    // 表名
    protected $name = 'sum_goods';

    protected $type = [
        'images' => 'json',
        'image_wh' => 'json',
        'params' => 'json',
    ];

    // 追加属性
    protected $append = [
        'status_text',
        'type_text',
//        'dispatch_type_text'
    ];


    protected $hidden = [
        'content',
        'max_sku_price',
        'score_sku_prices',
        'activity_sku_prices',
        'total_sales'       // 商品列表，销量排序会用到
    ];

    /**
     * type 中文
     */
    public function typeList()
    {
        return [
            'normal' => '实体商品',
            'virtual' => '虚拟商品',
            'card' => '电子卡密',
        ];
    }

    /**
     * status 中文
     */
    public function statusList()
    {
        return [
            'up' => '上架中',
            'down' => '已下架',
            'hidden' => '已隐藏',
        ];
    }

    /**
     * status 中文
     */
    public function dispatchTypeList()
    {
        return [
            'express' => '快递物流',
            'autosend' => '自动发货',
            'custom' => '商家发货'
        ];
    }


    /**
     * 修改器 service_ids
     *
     * @param array|string $value
     * @param array $data
     * @return string
     */
    public function setServiceIdsAttr($value, $data)
    {
        $service_ids = is_array($value) ? join(',', $value) : $value;
        return $service_ids;
    }


    public function setIsOfflineAttr($value, $data)
    {
        // 除了实体商品，其他都是 0
        return $data['type'] == 'normal' ? $value : 0;
    }


    public function scopeShow($query)
    {
        return $query->whereIn('status', ['up', 'hidden']);
    }


//    public function getDispatchTypeTextAttr($value, $data)
//    {
//        $value = $value ?: ($data['dispatch_type'] ?? null);
//
//        $list = $this->dispatchTypeList();
//        return isset($list[$value]) ? $list[$value] : '';
//    }


    public function getPriceAttr($value, $data)
    {
//        // 前端传入的 session_id
//        $activity_id = session('goods-activity_id:' . $data['id']);
//        if ($activity_id && $this->activity) {
//            // 活动商品的价格
//            $skuPrices = $data['new_sku_prices'] ?? [];
//            $prices = $skuPrices instanceof \think\Collection ? $skuPrices->column('min_price') : array_column($skuPrices, 'min_price');
//            $maxPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column('max_price') : array_column($skuPrices, 'max_price');
//            $min_price = $prices ? min($prices) : $data['price'];
//            $max_price = $maxPrices ? max($maxPrices) : $data['price'];
//            $priceArr[] = $min_price;
//            if ($min_price < $max_price) {
//                $priceArr[] = $max_price;
//            }
//        } else if (isset($data['show_score_shop'])) {
//            // 积分商品价格
//            $skuPrices = $data['new_sku_prices'] ?? [];
//            $skuPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column(null, 'score') : array_column($skuPrices, null, 'score');
//            ksort($skuPrices);
//            $skuPrice = current($skuPrices);      // 需要积分最少的规格
//            if ($skuPrice) {
//                // 不自动拼接积分
//                // $price = $skuPrice['score'] . '积分';
//                // if ($skuPrice['price'] > 0) {
//                //     $price .= '+￥' . $skuPrice['price'];
//                // }
//                // $priceArr[] = $price;
//                $priceArr[] = $skuPrice['price'];
//            } else {
//                // 防止没有规格
//                $priceArr[] = $data['price'];
//            }
//        } else {
            // 普通商品的价格区间
            $price = $value ? $value : ($data['price'] ?? 0);
            $priceArr = [$price];
//            if ($price && isset($data['is_sku']) && $data['is_sku']) {
//                $max_price = $this->max_sku_price->price;
//                if ($price < $max_price) {
//                    $priceArr[] = $max_price;
//                }
//            }
//        }

        return $priceArr;
    }



//    /**
//     * 这个目前只有拼团单独购买要使用
//     *
//     * @return void
//     */
//    public function getOriginalGoodsPriceAttr($value, $data)
//    {
//        $activity_id = session('goods-activity_id:' . $data['id']);
//        $priceArr = [];
//        if ($activity_id && $this->activity) {
//            // 活动商品的价格
//            $skuPrices = $data['new_sku_prices'] ?? [];
//            $prices = $skuPrices instanceof \think\Collection ? $skuPrices->column('old_price') : array_column($skuPrices, 'old_price');
//            $min_price = $prices ? min($prices) : $data['price'];
//            $max_price = $prices ? max($prices) : $data['price'];
//            $priceArr[] = $min_price;
//            if ($min_price < $max_price) {
//                $priceArr[] = $max_price;
//            }
//        }
//
//        return $priceArr;
//    }


//    /**
//     * 前端积分商城列表，获取默认所需积分（价格不自动拼接积分了，所以这里单独设置一个属性）
//     */
//    public function getScoreAttr($value, $data)
//    {
//        // 积分商品价格
//        $skuPrices = $data['new_sku_prices'] ?? [];
//        $skuPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column(null, 'score') : array_column($skuPrices, null, 'score');
//        ksort($skuPrices);
//        $skuPrice = current($skuPrices);      // 需要积分最少的规格
//        if ($skuPrice) {
//            $scoreAmount = $skuPrice['score'] ?? 0;
//        } else {
//            // 防止没有规格
//            $scoreAmount = 0;
//        }
//
//        return $scoreAmount;
//    }


    public function getSalesAttr($value, $data)
    {
        // 前端传入的 session_id
        $activity_id = session('goods-activity_id:' . $data['id']);
        $sales = $data['sales'] ?? 0;
        $sales += ($data['show_sales'] ?? 0);
        if ($activity_id && $this->activity) {
            if ($this->activity['rules'] && isset($this->activity['rules']['sales_show_type']) && $this->activity['rules']['sales_show_type'] == 'real') {
                // 活动设置显示真实销量
                $skuPrices = $data['new_sku_prices'] ?? [];
                $sales = array_sum($skuPrices instanceof \think\Collection ? $skuPrices->column('sales') : array_column($skuPrices, 'sales'));
            }
        } else if (isset($data['show_score_shop'])) {
            // 积分商城显示真实销量
            $skuPrices = $data['new_sku_prices'] ?? [];
            $sales = array_sum($skuPrices instanceof \think\Collection ? $skuPrices->column('sales') : array_column($skuPrices, 'sales'));
        }

        return $sales;
    }



    /**
     * 真实销量
     */
    public function getRealSalesAttr($value, $data)
    {
        $sales = $data['sales'] ?? 0;
        return $sales;
    }


//    /**
//     * 相关商品（包含活动）购买用户，只查三个
//     *
//     * @param [type] $value
//     * @param [type] $data
//     * @return void
//     */
//    public function getBuyersAttr($value, $data)
//    {
//        // 查询活动正在购买的人Goods
//        $activity_id = session('goods-activity_id:' . $data['id']);
//        $orderItems = OrderItem::with(['user' => function ($query) {
//            return $query->field('id,nickname,avatar');
//        }])->whereExists(function ($query) {
//            $order_name = (new Order())->getQuery()->getTable();
//            $order_item_name = (new OrderItem())->getQuery()->getTable();
//
//            $query->table($order_name)->where($order_item_name . '.order_id=' . $order_name . '.id')->whereIn('status', [Order::STATUS_PAID, Order::STATUS_COMPLETED, Order::STATUS_PENDING]);
//        });
//
//        if ($activity_id) {
//            $orderItems = $orderItems->where('activity_id', $activity_id);
//        }
//
//        $orderItems = $orderItems->fieldRaw('max(id),user_id')->where('goods_id', $data['id'])->group('user_id')->limit(3)->select();
//
//        $user = [];
//        foreach ($orderItems as $item) {
//            if ($item['user']) {
//                $user[] = $item['user'];
//            }
//        }
//
//        return $user;
//    }


//    public function getIsScoreShopAttr($value, $data)
//    {
//        $scoreGoodsIds = ScoreSkuPrice::group('goods_id')->cache(20)->column('goods_id');
//
//        return in_array($data['id'], $scoreGoodsIds) ? 1 : 0;
//    }


    /**
     * 获取当前商品所属分类的所有上级
     *
     * @param string $value
     * @param array $data
     * @return array
     */
    public function getCategoryIdsArrAttr($value, $data)
    {
        $categoryIds = $data['category_ids'] ? explode(',', $data['category_ids']) : [];

        $categoryIdsArr = [];
        $category = new Category();

        foreach ($categoryIds as $key => $category_id) {
            $currentCategoryIds = (new Tree($category))->getParentFields($category_id);
            if ($currentCategoryIds) {
                $categoryIdsArr[] = $currentCategoryIds;
            }
        }

        return $categoryIdsArr;
    }


//    /**
//     * 获取服务ids数组
//     *
//     * @param [type] $value
//     * @param [type] $data
//     * @return void
//     */
//    public function getServiceIdsAttr($value, $data)
//    {
//        $serviceIds = $this->attrFormatComma($value, $data, 'service_ids', true);
//
//        return $serviceIds ? array_values(array_filter(array_map("intval", $serviceIds))) : $serviceIds;
//    }



//    /**
//     * 获取所有服务列表
//     *
//     * @param string $value
//     * @param array $data
//     * @return array
//     */
//    public function getServiceAttr($value, $data)
//    {
//        $serviceIds = $this->attrFormatComma($value, $data, 'service_ids');
//
//        $serviceData = [];
//        if ($serviceIds) {
//            $serviceData = Service::whereIn('id', $serviceIds)->select();
//        }
//        return $serviceData;
//    }


//    /**
//     * 获取规格列表
//     *
//     * @param string $value
//     * @param array $data
//     * @return array
//     */
//    public function getSkusAttr($value, $data)
//    {
//        $sku = Sku::with('children')->where('goods_id', $data['id'])->where('parent_id', 0)->select();
//        return $sku;
//    }

//    /**
//     * 获取规格项列表
//     *
//     * @param string $value
//     * @param array $data
//     * @return array
//     */
//    public function getSkuPricesAttr($value, $data)
//    {
//        $skuPrices = collection(SkuPrice::where('goods_id', $data['id'])->select());
//        return $skuPrices;
//    }



//    /**
//     * 获取器获取所有活动
//     *
//     * @param string $value
//     * @param array $data
//     * @return array
//     */
//    public function getActivitiesAttr($value, $data)
//    {
//        $activities = ActivityFacade::getGoodsActivitys($data['id']);
//
//        return $activities;
//    }


//    /**
//     * 获取器获取指定活动
//     *
//     * @param string $value
//     * @param array $data
//     * @return array
//     */
//    public function getActivityAttr($value, $data)
//    {
//        $activity_id = session('goods-activity_id:' . $data['id']);
//        $activities = ActivityFacade::getGoodsActivityByActivity($data['id'], $activity_id);
//
//        return $activities;
//    }


//    public function getPromosAttr($value, $data)
//    {
//        $promos = ActivityFacade::getGoodsPromos($data['id']);
//
//        foreach ($promos as $key => $promo) {
//            $rules = $promo['rules'];
//            $rules['simple'] = true;
//            $tags = ActivityFacade::formatRuleTags($rules, $promo['type']);
//
//            $promo['tag'] = $tags[0] ?? '';
//            $promo['tags'] = $tags;
//
//            $texts = ActivityFacade::formatRuleTexts($rules, $promo['type']);
//            $promo['texts'] = $texts;
//
//            $promos[$key] = $promo;
//        }
//
//        return $promos ?? [];
//    }


//    /**
//     * 积分商城价格，积分商城的属性
//     *
//     * @param string $value
//     * @param array $data
//     * @return string
//     */
//    public function getScorePriceAttr($value, $data)
//    {
//        $scoreSkuPrices = collection($this->score_sku_prices)->column(null, 'score');
//        ksort($scoreSkuPrices);
//        $scoreSkuPrice = current($scoreSkuPrices);      // 需要积分最少的规格
//        // print_r($scoreSkuPrices);exit;
//        if ($scoreSkuPrice) {
//            $price['score'] = $scoreSkuPrice['score'] ?? 0;
//            $price['price'] = $scoreSkuPrice['price'] ?? 0;
//            return $price;
//        } else {
//            return null;
//        }
//
//        // return $score . '积分' . ($price > 0 ? '+￥' . $price : '');
//    }


//    /**
//     * 积分商城销量
//     *
//     * @param string $value
//     * @param array $data
//     * @return string
//     */
//    public function getScoreSalesAttr($value, $data)
//    {
//        $scoreSkuPrices = $this->score_sku_prices;
//
//        return array_sum(collection($scoreSkuPrices)->column('sales'));
//    }


//    /**
//     * 积分商城库存
//     *
//     * @param string $value
//     * @param array $data
//     * @return string
//     */
//    public function getScoreStockAttr($value, $data)
//    {
//        $scoreSkuPrices = $this->score_sku_prices;
//
//        return array_sum(collection($scoreSkuPrices)->column('stock'));
//    }


    public function maxSkuPrice()
    {
        return $this->hasOne(SkuPrice::class, 'goods_id')->order('price', 'desc');
    }

    public function favorite()
    {
        $user = auth_user();
        $user_id = empty($user) ? 0 : $user->id;
        return $this->hasOne(GoodsLog::class, 'goods_id', 'id')->where('user_id', $user_id)->favorite();
    }

    public function activitySkuPrices()
    {
        return $this->hasMany(ActivitySkuPriceModel::class, 'goods_id');
    }

    public function scoreSkuPrices()
    {
        return $this->hasMany(ScoreSkuPrice::class, 'goods_id')->up();
    }


    /**
     * 包含下架的积分规格
     */
    public function allScoreSkuPrices()
    {
        return $this->hasMany(ScoreSkuPrice::class, 'goods_id');
    }

    public function delScoreSkuPrices()
    {
        return $this->hasMany(ScoreSkuPrice::class, 'goods_id')->removeOption('soft_delete')->whereNotNull('deletetime');      // 只查被删除的记录，这里使用 onlyTrashed 报错
    }

    // -- commission code start --
    public function commissionGoods()
    {
        return $this->hasOne(\app\admin\model\sum\commission\CommissionGoods::class, 'goods_id');
    }
    // -- commission code end --
}
